package com.example.demo.controller;

import com.example.demo.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description:
 */
@Slf4j
@Controller
// 作用：表示返回的是一个非静态页面的数据
// 如果不加，默认情况下返回的是一个静态页面
@ResponseBody
@RequestMapping("user")
public class UserController {
    @Value("${img.path}")
    private String imgPath;

    @RequestMapping("/imgpath")
    public String img() {
        return "图片保存路径：" + imgPath;
    }

    // 在高版本的 Spring Boot里，这里的路由不加"/"也可以访问到
    // 但是低版本不行，因此为了兼容，作者建议加上"/"
    @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public String hello() {
        return "hello world!";
    }

    /**
     * 只支持 GET 请求的注释
     * @return
     */
    @GetMapping("/hello2")
    public String hello2() {
        return "hello world2!";
    }

    @RequestMapping("/getuserbyid")
    // 参数获取时必须使用包装类，避免异常的发生
    // 当前端传过来一个 null，避免直接在传参阶段就异常
    // 而是应该由我们对它进行非空校验，给前端返回一个更友好的界面
    public User getUserById(Integer id) {
        // 设置非空校验
        if(id == null) {
            return null;
        }
        User user = new User();
        user.setId(id);
        user.setUsername("zhangsan");
        user.setSex("男");
        return user;
    }

    /**
     * 模拟登录功能的实现
     * @param username
     * @param password
     * @return
     */
    @RequestMapping("/login")
    public String login(String username, String password) {
        System.out.println(password);
        return "username: " + username + " | password: " + password;
    }

    @RequestMapping("/logon")
    public String logon(@RequestBody User user) {
        return "用户信息：" + user;
    }

    @RequestMapping("/hello/{name}/{password}")
    public String hello(@PathVariable String name, @PathVariable String password) {
        return "name: " + name + " | password: " + password;
    }

    /**
     * 修改图片
     * @param id 用户id
     * @param file 上传的文件
     * @return 修改结果
     */
    @RequestMapping("/updateimg")
    // 在添加 @RequestPart 注解的同时，说明前端传过来的文件参数 key 值是 img
    public boolean updateImg(Integer id, @RequestPart("img") MultipartFile file){
        boolean result = false;
        String fileName = file.getOriginalFilename();
        // 截取从最后一个"."到末尾的原文件的名称，就是原文件的后缀名
        fileName = fileName.substring(fileName.lastIndexOf('.'));
        // 图片文件名称
        fileName = UUID.randomUUID().toString() + fileName;
        // 此时已经获取到图片文件，将文件保存到本地
        // 同时规定保存的文件名和文件类型
        try {
            // transferTo 需要处理异常
            file.transferTo(new File(imgPath + fileName));
            result = true;
        } catch (IOException e) {
            // 可以对其进行日志打印练习
            log.error("上传图片失败: " + e.getMessage());
        }
        return result;
    }

    @RequestMapping("/cookie")
    public String getCookie(@CookieValue("zhangsan") String cookie) {
        return "cookie value: " + cookie;
    }

    @RequestMapping("getua")
    public String getHeader(@RequestHeader("User-Agent") String userAgent) {
        return "User-Agent：" + userAgent;
    }

    @RequestMapping("/setsion")
    public boolean setSession(HttpServletRequest req) {
        // 创建 HttpSession 对象
        // boolean 值 true 表示如果没有 session，就创建一个
        // false 正好相反，没有就不创建
        HttpSession session = req.getSession(true);
        // 设置 session 的值
        session.setAttribute("user", "user");
        return true;
    }

    @RequestMapping("/getsion")
    public String getSession(HttpServletRequest req) {
        String result = null;
        HttpSession session = req.getSession(false);
        if(session != null && session.getAttribute("user") != null) {
            result = (String) session.getAttribute("user");
        }
        return result;
    }

    @RequestMapping("/getsion2")
    public String getSession2(@SessionAttribute(value = "user", required = false) String key) {
        return "会话：" + key;
    }
}
